0x000 概述

反射说起来和上一章节的代理基本一样,只是使用的方式不同,设计理念也不同。

反射提供了一系列的静态函数,可以使用Reflect.function_name(...prams)调用,这一系列的方法和代理处理器对象方法一致

0x001 apply

  • 语法

    Reflect.apply(target, thisArgument, argumentsList)
    • 参数:

      • target:目标
      • thisArgument:调用的上下文
      • argumentList:参数列表
  • 栗子

    function sayHelloTo(name, age){
        console.log(`hello ${name}, i am ${this.name}, ${age} years old now`)
    }
    let obj={
        name: 'jack'
    }
    Reflect.apply(sayHelloTo, obj, ['jack', 23])
    // hello jack, i am jack, 23 years old now

0x002 construct

  • 语法

    Reflect.construct(target, argumentsList[, newTarget])
    • target:目标
    • argumentsList:参数列表
    • newTarget:新的目标
  • 栗子

    function Person(name){
        console.log(`Person ${name}`)
    }
    let obj={age:23}
    Reflect.construct(Person,['jack'])
    // Person jack

0x003 getOwnPropertyDescriptor

  • 语法

    Reflect.getOwnPropertyDescriptor(target, propKey)
    • target:目标
    • propKey:属性值
  • 栗子

    let obj={name:'jack'}
    Reflect.getOwnPropertyDescriptor(obj, 'name')
    // {value: "jack", writable: true, enumerable: true, configurable: true}

0x004 defineProperty

  • 语法

    Reflect.defineProperty(target, propertyKey, attributes)
    • target:目标
    • propertyKey:属性名
    • attributes:属性描述
  • 栗子

    let obj={}
    Reflect.defineProperty(obj,'name',{value:'jack'})
    console.log(obj) // {name:'jack'}

0x005 deleteProperty

  • 语法

    Reflect.deleteProperty(target, propertyKey)
    • target:目标
    • propertyKey:属性名
  • 栗子

    let obj={name:'jack'}
    Reflect.deleteProperty(obj, 'name')
    // true

0x006 ownKeys

  • 语法

    Reflect.ownKeys(target)
    • target:目标
  • 栗子

    Reflect.ownKeys({name:'jack'})
    // ["name"]

0x007 has

  • 语法

    Reflect.has(target, propertyKey)
    • target:目标
    • propertyKey:属性名
  • 栗子

    Reflect.has({name:'jack'},'name')
    // true
    Reflect.has({name:'jack'},'age')
    // false

0x008 get

  • 语法

    Reflect.get(target, propertyKey[, receiver])
    • target:目标
    • propertyKey:属性名
    • receiver:接收者
  • 栗子

    let obj={name:'jack'}
    Reflect.get(obj, 'name')
    // "jack"

0x009 preventExtensions

  • 语法

    Reflect.preventExtensions(target)
    • target:目标
  • 栗子

    Reflect.ownKeys({name:'jack',age:'23'})
    // (2) ["name", "age"]

0x009 isExtensible

  • 语法

    Reflect.isExtensible(target)
    • target:目标
  • 栗子

    Reflect.isExtensible({})
    // true
    Reflect.isExtensible(Object.seal({}))
    // false
    Reflect.isExtensible(Object.freeze({}))
    // false
    let obj=Reflect.preventExtensions({})
    Reflect.isExtensible(obj)
    // false

0x011 preventExtensions

  • 语法

    Reflect.preventExtensions(target)
    • target:目标
  • 栗子

    Reflect.ownKeys({name:'jack',age:'23'})
    // (2) ["name", "age"]

0x012 setPrototypeOf

  • 语法

    Reflect.setPrototypeOf(target, prototype)
    • target:目标
    • prototype:要设置的 prototype
  • 栗子

    Reflect.setPrototypeOf(obj, Array)
    Reflect.getPrototypeOf(obj)
    // ƒ Array() { [native code] }
    

0x013 getPrototypeOf

  • 语法

    Reflect.getPrototypeOf(target)
    • target:目标
  • 栗子

    Reflect.getPrototypeOf([])
    // [constructor: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …]

followWinter
1.5k 声望82 粉丝

暂时没有